<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>类的基本知识</title>
</head>
<body>

<script type="text/javascript">
  //创建一个Person的实例对象

  /*
    总结：
      1.类中的构造器不是必须写的，需要对实例进行一些初始化的操作时才写，如添加属性
      2.如A类继承了B类，且A类写了构造器，那么A类构造器中的super是必须要调用的
      3.类中所定义的方法，都是放在了类的原型对象上，供实例去使用
   */

  class Person{
    //构造器方法
    constructor(name,age) {
      //构造器中的this是谁？——类的实例对象
      this.name = name;
      this.age = age;
    }
    //一般方法
    speak(){
      //sprak方法放在哪里？——类的原型对象上，供实例使用
      //通过Person实例调用speak时，speak中的this就是Person实例
      console.log(`我叫${this.name}，我年龄${this.age}`);
    }
  }
  //创建一个Person的实例对象
  /*
  const p1 = new Person('Tom',18)
  const p2 = new Person('Tim',19)
  console.log(p1);
  console.log(p2);
  p1.speak();
  p2.speak();
   */

  //创建一个Student类，继承Person类

  class Student extends Person{
    constructor(name,age,grade) {
      super(name,age);
      this.grade = grade
    }
    //重写从父类继承过来的方法
    speak() {
      console.log(`我叫${this.name}，我年龄${this.age}，我读${this.grade}年级`);
    }
    study(){
      console.log(`我很努力学习`)
    }
  }
  const s1 = new Student('Bob',18,'高一')
  console.log(s1)
  s1.speak();
  s1.study();


  class Car{
      constructor(name,price) {
          this.name = name;
          this.price = price;
          // this.wheel = 4;
      }
      //类中可以直接写赋值语句，如下代码的含义是：给Car的实例对象添加一个属性,名为a，值为1
      a = 1
      wheel = 4;
  }
  const c1 = new Car('奔驰E',599999)
  const c2 = new Car('奥迪A6',299999)
  console.log(c1)
  console.log(c2)
</script>

</body>
</html>